package com.javaxiaobear.base.framework.security;

import cn.hutool.core.collection.CollUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.javaxiaobear.module.system.domain.SysRole;
import com.javaxiaobear.module.system.domain.SysUser;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.Data;

/**
 * 登录用户身份权限
 *
 * @author javaxiaobear
 */
@Data
public class LoginUser {

  /** 用户ID */
  private Long userId;

  /** 部门ID */
  private Long deptId;

  /** 用户唯一标识 */
  private String token;

  /** 登录时间 */
  private Long loginTime;

  /** 过期时间 */
  private Long expireTime;

  /** 登录IP地址 */
  private String ipaddr;

  /** 登录地点 */
  private String loginLocation;

  /** 浏览器类型 */
  private String browser;

  /** 操作系统 */
  private String os;

  /** 权限列表 */
  private Set<String> permissions;

  /** 用户信息 */
  private SysUser user;

  public LoginUser() {}

  public LoginUser(SysUser user, Set<String> permissions) {
    this.user = user;
    this.permissions = permissions;
  }

  public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions) {
    this.userId = userId;
    this.deptId = deptId;
    this.user = user;
    this.permissions = permissions;
  }

  /** 账户是否未过期,过期无法验证 */
  @JsonIgnore
  public boolean isAccountNonExpired() {
    return true;
  }

  /**
   * 指定用户是否解锁,锁定的用户无法进行身份验证
   *
   * @return
   */
  @JsonIgnore
  public boolean isAccountNonLocked() {
    return true;
  }

  /**
   * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
   *
   * @return
   */
  @JsonIgnore
  public boolean isCredentialsNonExpired() {
    return true;
  }

  @JsonIgnore
  public String getPassword() {
    return user.getPassword();
  }

  public String getUsername() {
    return user.getUserName();
  }

  /** 是否可用 ,禁用的用户不能身份验证 */
  @JsonIgnore
  public boolean isEnabled() {
    return true;
  }

  public Set<String> getRoles() {
    if (CollUtil.isEmpty(this.user.getRoles())) {
      return new HashSet<>(0);
    }
    return this.user.getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toSet());
  }
}
